import 'dart:async';

typedef ThrottledFunction<T> = void Function(T args);

/// 节流函数 (执行频率控制)
/// [func]: 需要节流的函数
/// [duration]: 节流时间间隔
ThrottledFunction<T> throttle<T>(
  void Function(T args) func, {
  Duration duration = const Duration(milliseconds: 200),
}) {
  DateTime? lastExecutionTime;

  return (T args) {
    final now = DateTime.now();
    if (lastExecutionTime == null ||
        now.difference(lastExecutionTime!) >= duration) {
      lastExecutionTime = now;
      func(args);
    }
  };
}

typedef DebouncedFunction<T> = void Function(T args);
typedef CancelDebounce = void Function();

/// 防抖函数 (延迟执行)
/// [func]: 需要防抖的函数
/// [duration]: 防抖延迟时间
/// [leading]: 是否立即执行第一次调用
///
/// 返回: [DebouncedFunction] 和 [CancelDebounce] 取消方法
(DebouncedFunction<T>, CancelDebounce) debounce<T>(
  void Function(T args) func, {
  Duration duration = const Duration(milliseconds: 500),
  bool leading = false,
}) {
  Timer? timer;

  void cancel() {
    timer?.cancel();
    timer = null;
  }

  void debounced(T args) {
    cancel(); // 取消之前的计时器

    if (leading && timer == null) {
      func(args); // 立即执行第一次
    }

    timer = Timer(duration, () {
      if (!leading) func(args); // 延迟执行后续
      timer = null;
    });
  }

  return (debounced, cancel);
}


// // 原始回调
// void updateProgress(int count, int total) {
//   print('Progress: ${(count / total * 100).toStringAsFixed(1)}%');
// }

// // 包装为节流版本 (每 200ms 最多触发一次)
// final throttledUpdate = throttle<({int count, int total})>(
//   (args) => updateProgress(args.count, args.total),
//   duration: Duration(milliseconds: 200),
// );

// // 使用方式
// throttledUpdate((count: 50, total: 100));

// // 原始搜索方法
// void search(String keyword) {
//   print('Searching: $keyword');
// }

// // 包装为防抖版本 (500ms 延迟，不立即执行)
// final (debouncedSearch, cancelSearch) = debounce<String>(
//   search,
//   duration: Duration(milliseconds: 500),
// );

// // 输入时调用
// debouncedSearch('flutter');

// // 取消未执行的搜索
// cancelSearch();